package com.example.gson;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.example.gson.entity.Grade;
import com.example.gson.entity.Student;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;

public class MainActivity extends AppCompatActivity {


    private EditText edtJson,edtObj;
    private Button btnToJson,btnToObj;
    private Gson gson;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findview();

        //初始化
        initGson();

        //注册监听器
        setListener();



    }


    private void setListener() {
        //序列化-----------------------------------
        btnToJson.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //普通简单对象序列化
//                simpleObjToJson();

                //格式化带日期属性的对象
//                formatObjToJson();

                //嵌套对象序列化
//                conplexObjToJson();

                //对象数组序列化
//                arrayObjToJson();

                //集合序列化
                collectionToJson();
            }

        });

        //反序列化----------------------------------
        btnToObj.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //普通对象对应的JSON串反序列化
//                simpleJsonToObj();
                //数组的反序列化
//                arrayJsonToObj();
                //集合反序列化
                collectionToObj();


            }
        });

    }

    private void collectionToObj() {
        String students = edtJson.getText().toString();

        //利用反射得到无具体类型
        Type type = new TypeToken<ArrayList<Student>>(){}.getType();
        ArrayList<Student> stu = gson.fromJson(students,type);
        edtObj.setText(stu.toString());



    }

    private void collectionToJson() {
        List<Student> students = new ArrayList<>();
        students.add(new Student("jack",18));
        students.add(new Student("liwei",20));

        String json = gson.toJson(students);
        edtJson.setText(json);

    }

    private void arrayJsonToObj() {

        String students = edtJson.getText().toString();
        Student[] stus = gson.fromJson(students,Student[].class);
        edtObj.setText(Arrays.asList(stus).toString());

    }

    private void arrayObjToJson() {
        Student[] students = new Student[2];
        students[0] = new Student("jack",18);
        students[1] = new Student("liwei",20);

        String json = gson.toJson(students);
        edtJson.setText(json);

    }

    private void conplexObjToJson() {

        //造对象
        Student jack = new Student("jack",18);
        jack.setGrade(new Grade("Android",100));
        //序列化
        String json = gson.toJson(jack);
        //显示
        edtJson.setText(json);




    }

    private void formatObjToJson() {

        try {
            //创建对象
            Student jack = new Student("杰克",20);
            SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
            Date birthday = format.parse("2005/09/14");
            jack.setBirthday(birthday);
            //序列化
            String json = gson.toJson(jack);
            //显示
            edtJson.setText(json);



        } catch (ParseException e) {
            e.printStackTrace();
        }


    }

    private void simpleJsonToObj() {
        //获取编辑框中的JSON串
        String json = edtJson.getText().toString();
        //将JSON串反序列化为对象
        Student stu = gson.fromJson(json,Student.class);
        //将对象显示在对象编辑框中 toString方法的调用
        edtObj.setText(stu.toString());

    }

    private void simpleObjToJson() {
        //创建对象
        Student jack = new Student("杰克",20);
        //利用GSON框架将对象序列化为JSON串
        String json = gson.toJson(jack);
        //把JSON串显示在编辑框中
        edtJson.setText(json);
    }



    private void initGson() {
//        gson = new Gson();
        gson = new GsonBuilder()
                .serializeNulls()  //强制null值输出
                .setPrettyPrinting()  //格式化JSON串
                .setDateFormat("yyyy-MM-dd")  //格式化日期
                .create();

    }



    private void findview() {
        edtJson = findViewById(R.id.edt_json);
        edtObj = findViewById(R.id.edt_obj);
        btnToJson = findViewById(R.id.btn_toJson);
        btnToObj = findViewById(R.id.btn_toObj);
    }
}
















